package dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import bo.Cidade;
import exception.DataException;
import exception.DatabaseConnectException;
import exception.EmptyResultException;
import exception.InvalidNameException;

public class CidadeDAO {

	public ArrayList<Cidade> consultaTodosRegistros() throws DataException,
			EmptyResultException, SQLException, DatabaseConnectException,
			InvalidNameException {

		ArrayList<Cidade> cidades = null;
		PreparedStatement preparedStatement = null;
		ResultSet resultSet = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT cidade.id, cidade.ds_cidade, cidade.uf "
									+ "FROM cidade ORDER BY cidade.id;");

			resultSet = preparedStatement.executeQuery();

			cidades = new ArrayList<Cidade>();
			
			while (resultSet.next()) {
				Cidade cidade = new Cidade();
				cidade.setId(resultSet.getInt(1));
				cidade.setDescricao(resultSet.getString(2));
				cidade.setUf(resultSet.getString(3));
				cidades.add(cidade);
			}

			if (cidades.isEmpty()) {
				throw new EmptyResultException();
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			if (resultSet != null) {
				resultSet.close();
			}
			if (preparedStatement != null) {
				preparedStatement.close();
			}
		}

		return cidades;

	}

	public ArrayList<Cidade> consultaPorId(Integer id)
			throws DatabaseConnectException, DataException, SQLException,
			EmptyResultException, InvalidNameException {

		ArrayList<Cidade> cidades = null;
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT cidade.id, cidade.ds_cidade, cidade.uf "
									+ "FROM cidade WHERE cidade.id = ? ORDER BY cidade.id;");

			preparedStatement.setInt(1, id);

			resultSet = preparedStatement.executeQuery();

			cidades = new ArrayList<Cidade>();
			
			while (resultSet.next()) {
				Cidade cidade = new Cidade();
				cidade.setId(resultSet.getInt(1));
				cidade.setDescricao(resultSet.getString(2));
				cidade.setUf(resultSet.getString(3));
				cidades.add(cidade);
			}

			if (cidades.isEmpty()) {
				throw new EmptyResultException();
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			if (resultSet != null) {
				resultSet.close();
			}
			if (preparedStatement != null) {
				preparedStatement.close();
			}
		}

		return cidades;
	}

	public ArrayList<Cidade> consultaPorDescricao(String descricao)
			throws DatabaseConnectException, DataException, SQLException,
			EmptyResultException, InvalidNameException {

		ArrayList<Cidade> cidades = null;
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT cidade.id, cidade.ds_cidade, cidade.uf "
									+ "FROM cidade WHERE cidade.ds_cidade LIKE ? ORDER BY cidade.ds_cidade;");

			preparedStatement.setString(1, "%"+descricao+"%");

			resultSet = preparedStatement.executeQuery();

			cidades = new ArrayList<Cidade>();

			while (resultSet.next()) {
				Cidade cidade = new Cidade();
				cidade.setId(resultSet.getInt(1));
				cidade.setDescricao(resultSet.getString(2));
				cidade.setUf(resultSet.getString(3));
				cidades.add(cidade);
			}

			if (cidades.isEmpty()) {
				throw new EmptyResultException();
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			if (resultSet != null) {
				resultSet.close();
			}
			if (preparedStatement != null) {
				preparedStatement.close();
			}
		}

		return cidades;
	}

	public ArrayList<Cidade> consultaPorUf(String uf)
			throws DatabaseConnectException, DataException, SQLException,
			EmptyResultException, InvalidNameException {

		ArrayList<Cidade> cidades = null;
		ResultSet resultSet = null;
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"SELECT id, ds_cidade, uf FROM cidade WHERE cidade.uf LIKE ? ORDER BY cidade.uf;");

			preparedStatement.setString(1, "%" + uf + "%");

			resultSet = preparedStatement.executeQuery();

			cidades = new ArrayList<Cidade>();
			
			while (resultSet.next()) {
				
				Cidade cidade = new Cidade();
				cidade.setId(resultSet.getInt(1));
				cidade.setDescricao(resultSet.getString(2));
				cidade.setUf(resultSet.getString(3));
				cidades.add(cidade);
			}
			
			if (cidades.isEmpty()) {
				throw new EmptyResultException();
			}

		} catch (SQLException e) {
			throw new DataException(e, DataException.SELECT);
		} finally {
			if (resultSet != null) {
				resultSet.close();
			}
			if (preparedStatement != null) {
				preparedStatement.close();
			}
		}

		return cidades;
	}

	public void incluir(Cidade cidade) throws DataException,
			DatabaseConnectException, SQLException {
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"INSERT INTO cidade (id, ds_cidade, uf)"
									+ " VALUES (nextval('seqcidade'), ?, ?)");

			preparedStatement.setString(1, cidade.getDescricao());
			preparedStatement.setString(2, cidade.getUf());
			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			throw new DataException(e, DataException.INSERT);
		} finally {
			if (preparedStatement != null) {
				preparedStatement.close();
			}
		}
	}

	public void alterar(Cidade cidade) throws DataException,
			DatabaseConnectException, SQLException {
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao
					.getInst()
					.getConnection()
					.prepareStatement(
							"UPDATE cidade " + "SET ds_cidade = ?, uf = ?"
									+ " WHERE cidade.id = ?");

			preparedStatement.setString(1, cidade.getDescricao());
			preparedStatement.setString(2, cidade.getUf());
			preparedStatement.setInt(3, cidade.getId());
			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			throw new DataException(e, DataException.UPDATE);
		} finally {
			if (preparedStatement != null) {
				preparedStatement.close();
			}
		}
	}

	public void excluir(Integer id) throws DataException,
			DatabaseConnectException, SQLException {
		PreparedStatement preparedStatement = null;

		try {
			preparedStatement = Conexao.getInst().getConnection()
					.prepareStatement("DELETE FROM cidade WHERE cidade.id = ?");

			preparedStatement.setInt(1, id);

			preparedStatement.executeUpdate();

		} catch (SQLException e) {
			throw new DataException(e, DataException.DELETE);
		} finally {
			if (preparedStatement != null) {
				preparedStatement.close();
			}
		}
	}

}
